<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>javascript 阶段</title>
</head>

<body>
    <h3>原型和原型链</h3>

    <script>
        // 原始对象构造函数
        // Object 构造函数
        // Object.prototype 原型
        // 在Object构造函数的原型上添加的属性和方法,任何一个构造函数的实例都可以使用
        Object.prototype.bike = "共享单车 2.0";
        Object.prototype.sayHello = function () {
            console.log("hello world");
        }

        // 创建数组的实例
        var arr = new Array();
        // 创建字符串的实例
        var str = new String();

        //属性
        console.log(arr.bike);// 共享单车 2.0
        console.log(str.bike);// 共享单车 2.0
        // 方法
        arr.sayHello();// hello world
        str.sayHello();// hello world

        // 自定义构造函数
        function App() {
            // 添加属性
            this.width = "100px";
        }
        // App构造函数原型添加方法(随机整数)
        App.prototype.getRandom = function (min, max) {
            return Math.round(Math.random() * (max - min) + min);
        }
        App.prototype.love = function () {
            console.log(this.width);
        }
        // Object 构造函数原型添加方法(获取坐标)
        Object.prototype.getPos = function () {
            return {
                x: 100,
                y: 200
            }
        }


        // 实例对象(a1)
        var a1 = new App();
        console.log(a1);

        // console.log( a1.bike );// 共享单车 2.0
        // a1.sayHello();// hello world



        // 原型链
        // 构造函数: App
        // App原型对象: App.prototype
        // Object原型对象: Object.prototype
        console.log(a1.width);// 100px
        var num = a1.getRandom(50, 200);
        console.log(num);// 随机整数
        var point = a1.getPos();
        console.log(point);// {x: 100, y: 200}

        console.log(a1);// 实例对象
        console.log(a1.__proto__);// App.prototype
        console.log(a1.__proto__.__proto__);// Object.prototype
        console.log(a1.__proto__.__proto__.__proto__);// null (链式结构结束的位置)

        // 上述的链式结构,我们叫做原型链
        // 可以把属性和方法添加到原型链上,实现数据和方法的共享.


        // 原型链:
        // a1.__proto__.__proto__.__proto__

        Object.prototype.car = "共享汽车";
        Object.prototype.saygoodbye = function () {
            console.log("good bye!");
        }

        var arr_1 = new Array();
        var str_1 = new String();
        var arr_2 = "";

        console.log(arr_1.car);
        console.log(str_1.car);
        console.log(arr_2.car);

        arr_1.saygoodbye();
        arr_2.saygoodbye();
        // arr_3.saygoodbye();

        function App_1() {
            this.width = "100px";
        }

        // console.log(arr_2.);

        App_1.prototype.getRandom = function (xiao, da) {
            return Math.round(Math.random() * (da - xiao) + xiao);
        }
        // App_1.protptype.sleep = 

        Object.prototype.getPo = function () {
            return {
                x: 200,
                y: 100
            }
        }

        var a2 = new App();

        console.log(a2.bike);// 共享单车 2.0
        a2.sayHello();// hello world


    </script>
</body>

</html>